package pe.com.hermes.hermetic.web.controller.consultas;

import com.itextpdf.text.Image;
import com.itextpdf.text.pdf.PdfContentByte;
import com.itextpdf.text.pdf.PdfReader;

import com.itextpdf.text.pdf.PdfStamper;
import java.io.File;
import java.io.FileInputStream;
import java.io.InputStream;

import java.net.URI;

import java.util.ArrayList;
import java.util.List;

import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.log4j.Logger;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.ModelMap;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.SessionAttributes;

import pe.com.hermes.hermetic.beans.AuditBean;
import pe.com.hermes.hermetic.negocio.service.HermeticFacade;
import pe.com.hermes.hermetic.negocio.service.PedidoService;
import pe.com.hermes.hermetic.negocio.service.TablService;
import pe.com.hermes.hermetic.web.controller.base.IController;
import pe.com.hermes.hermetic.web.controller.base.IWebOpciones;
import pe.com.hermes.hermetic.web.forms.HMF3016Form;
import pe.com.hermes.hermetic.web.forms.HMF3017Form;
import pe.com.hermes.unidadesnegocio.comercial.entities.ClienteEntity;

import java.io.FileOutputStream;

import pe.com.hermes.hermetic.beans.ArchPedidosAgrupadosBean;


@SessionAttributes(value={"form","mostrarGrilla","codOpci"})
@RequestMapping("/mostrarHWF3017.html")
@Controller
public class RecepcionPedidosAgrupadosController implements IController {
    
    private Logger logger = Logger.getLogger(this.getClass());
    
    @Autowired
    private HermeticFacade servicioHermetic;

    @Autowired
    private PedidoService pedidoService;
    
    @RequestMapping(method=RequestMethod.GET)
    protected String showForm(ModelMap model, HttpServletRequest request) throws Exception {
        
        HMF3017Form form=new HMF3017Form();
        form.setFechaInic(servicioHermetic.getFechaHoy());
        form.setFechaDest(servicioHermetic.getFechaHoy());
        List<ClienteEntity> listaClientes=servicioHermetic.getListClieArchPedi();
        String nomCliente=(String)request.getSession(false).getAttribute("nombreCliente");
        model.put("listaClientes",listaClientes);
        model.put(FORM_KEY,form);
        model.put("mostrarGrilla",false);
        String codOpci = IWebOpciones.RECEP_ARCH_PEDI_AGRU;
        String desOpci = servicioHermetic.getDesOpci(codOpci, request);
        model.put("codOpci",codOpci);
        model.put("desOpci",desOpci);
        AuditBean auditBean = new AuditBean(RECEP_ARCH_PEDI_AGRU);
        servicioHermetic.inseAudit(auditBean);
        return FORM_RECP_ARCH_AGRU;
    }
    
    
    @RequestMapping(params={"accion=mostrar","fechaInic","fechaDest","codCliente"})
    private String mostrar (@RequestParam("fechaInic") String fechaInic,@RequestParam("fechaDest") String fechaDest,@RequestParam("codCliente") String codCliente,
                            ModelMap model,@ModelAttribute(FORM_KEY) HMF3017Form form, HttpServletRequest request) throws Exception {    
      
        List listaArchivos=new ArrayList();
        String mensajeError="";
        if (codCliente == null || codCliente.equals("")) codCliente="0";
        int codClie=Integer.valueOf(codCliente).intValue();
        try{         
            listaArchivos=pedidoService.consArchPediClie(codClie,fechaInic,fechaDest,0);
            
        }catch(Exception ex){
            //ex.printStackTrace();
            logger.error("Error al mostrar lista de Archivos de Pedidos Agrupados",ex);
            model.put("mensajeError",mensajeError);
            model.put(FORM_KEY,form);
            return FORM_RECP_ARCH_AGRU;
        }
        int totalHojas=0;
        if (listaArchivos!=null){
            for (int i=0;i<listaArchivos.size();i++){
              ArchPedidosAgrupadosBean archBean=(ArchPedidosAgrupadosBean)listaArchivos.get(i);
              totalHojas+=archBean.getNumHojas();
            }
        }
        model.put(FORM_KEY,form);
        model.put("listaArchivos",listaArchivos);
        model.put("totalHojas",totalHojas);
        model.put("mostrarGrilla",true);
        return FORM_RECP_ARCH_AGRU;
    }
    
    @RequestMapping(params={"accion=descargarArchivo"})
    protected void descargarArchivo(ModelMap model,@ModelAttribute(FORM_KEY) HMF3017Form form, HttpServletRequest request, HttpServletResponse response) throws Exception{
        
        String ruta=form.getRutaDescarga();
        if (ruta.indexOf(" ")!=-1){
            ruta=ruta.replaceAll(" ","%20");
        }
        String nombre=form.getNombreDescarga();
        String codArchPediString=form.getCodArchPedi()==null?"0":form.getCodArchPedi();
        int codArchPedi=Integer.valueOf(codArchPediString).intValue();
        String extension=ruta.substring(ruta.indexOf("."),ruta.length());
        String fileName=nombre+extension;
        String codClie=form.getCliente();
        String estado=form.getEstadoArchivo();
        try{
            
            ServletOutputStream servletOutputStream = response.getOutputStream();    
            File archivo=new File(new URI(ruta));

          /*MODIFICACION DEL PDF, SOLO SI ES LA PRIMERA DESCARGA*/
            if (estado!=null && estado.equals("1")){              
              PdfReader pdfReader=new PdfReader(ruta);
              PdfStamper pdfStamper = new PdfStamper(pdfReader, new FileOutputStream(archivo));
              
              Image image = Image.getInstance(request.getSession().getServletContext().getRealPath("/")+"/imagenes/pediAgrup"+codClie+".GIF");
                for(int i=1; i<= pdfReader.getNumberOfPages(); i++){

                    PdfContentByte content = pdfStamper.getOverContent(i);
                    image.setAbsolutePosition(0f, 810f);
                    content.addImage(image);
                }
              
              pdfStamper.close();
              /*FIN MODIFICACION PDF*/  
            }
            
            archivo=new File(new URI(ruta));
            InputStream isr = new FileInputStream (archivo);
            
            response.addHeader("Content-type", "application/octet-stream");
            response.addHeader("Content-Disposition", "attachment;filename="+fileName);
            response.setContentType("Content-type: application/octet-stream");
            
            response.setHeader("Cache-Control","cache"); // HTTP 1.1
            response.setHeader("Pragma","cache"); // HTTP 1.0
            response.setDateHeader ("Expires", -1);          
            
            long length = archivo.length();
            byte[] bytes = new byte[(int)length];
            
            // Read in the bytes
            int offset = 0;
            int numRead = 0;
            while (offset < bytes.length && (numRead=isr.read(bytes, offset, bytes.length-offset)) >= 0) {
                offset += numRead;
            }
            
            isr.close();
            
            servletOutputStream.write(bytes);
            servletOutputStream.flush();
            servletOutputStream.close();
            
            String usuario=(String)request.getSession(false).getAttribute("usuario");
            int error=pedidoService.updtArchPediClie(codArchPedi,2,"SRVOAS3",usuario);
            logger.info("DESCARGA DE ARCHIVOS DE PEDIDOS AGRUPADOS-"+error);
        }
        catch(Exception ex){
            ex.printStackTrace();
        }
               
    }
    
    @RequestMapping(params={"accion=recepcionarArchPedi","codArchPedi","fechaInic","fechaDest","codCliente"})
    protected String recepcionarArchPedi(@RequestParam("codArchPedi")String codArchPediString,
                                    @RequestParam("fechaInic")String fechaInic,
                                    @RequestParam("fechaDest")String fechaDest,
                                    @RequestParam("codCliente")String codCliente,
                                    ModelMap model,@ModelAttribute(FORM_KEY) HMF3017Form form, HttpServletRequest request) throws Exception{
        
        
        logger.info(this.getClass().toString()+" "+"metodo: recepcionarArchPedi");
        List listaArchivos = new ArrayList();
        codCliente=(codCliente==null||codCliente.trim().equals(""))?"0":codCliente;
        int codClie=Integer.valueOf(codCliente).intValue();
        //Invocar al servicio que elimina el archivo
        String usuario=(String)request.getSession(false).getAttribute("usuario");
        int codArchPedi=codArchPediString==null?0:Integer.valueOf(codArchPediString).intValue();
        int error=pedidoService.updtArchPediClie(codArchPedi,2,"SRVOAS3",usuario);
        //Invocar de nuevo a la busqueda
        if (error>0){
            logger.error("Error al recepcionar un archivo de Pedidos Agrupados");
            model.put("mensajeError","Error al recepcionar el archivo");
            model.put(FORM_KEY,form);
            return FORM_RECP_ARCH_AGRU;
        }

         listaArchivos=pedidoService.consArchPediClie(codClie,fechaInic,fechaDest,0); 
         model.put(FORM_KEY,form);
         model.put("listaArchivos",listaArchivos);
         return FORM_RECP_ARCH_AGRU; 
               
    }
    
}
